package com.nf.health.app.utils;

import android.text.TextUtils;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtil {

	/**
	 * @Title: isBillNo
	 * @Description: 运单号，8到20位数字
	 * @param billNo
	 * @return
	 * @return: boolean
	 */
	public static boolean isBillNo(String billNo) {
		Pattern billNoPatten = Pattern.compile("[a-zA-Z0-9]{8,16}");
		return billNoPatten.matcher(billNo).matches();
	}

	/**
	 * @Title: isMobilePhone
	 * @Description: TODO验证是否是手机号
	 * @param @param phoneNo
	 * @param @return
	 * @return boolean
	 * @throws
	 */
	public static boolean isMobilePhone(String phoneNo) {
		Pattern mobilePhonePatten = Pattern.compile("(1[3|4|5|7|8][0-9]\\d{8})");
		return mobilePhonePatten.matcher(phoneNo).matches();
	}

	/**
	 * @Title: isPassword
	 * @Description: TODO验证密码只能包含数字和字母
	 * @param @param str
	 * @param @return
	 * @return boolean
	 * @throws
	 */
	public static boolean isPassword(String str) {
		if (!str.matches("^[0-9a-zA-Z]+$")) {
			return false;
		} else {
			return true;
		}
	}
	
	
	/**
	 * 后缀两个小数位
	 * 
	 * @param str
	 * @return
	 */
	public static String convert2dot(Double str) {
		try {
			return String.format(Locale.CHINESE, "%.2f", str);
		} catch (Exception e) {
			LogUtil.i("StringUtil", "convert2dot");
			return "0.00";
		}
	}

	/**
	 * @Title: checkDetailAddress
	 * @Description: TODO匹配详细地址 中文和数字
	 * @param @param addr
	 * @param @return
	 * @return boolean
	 * @throws
	 */
	public static boolean checkDetailAddress(String addr) {
		if (addr.matches("^[\u4e00-\u9fa50-9]+$")) {
			return true;
		} else {
			return false;
		}

	}

	/**
	 * @Title: checkDetailAddress
	 * @Description: TODO匹配 中文，数字，字母
	 * @param @param addr
	 * @param @return
	 * @return boolean
	 * @throws
	 */
	public static boolean checkName(String addr) {
		if (addr.matches("^[\u4e00-\u9fa50-9A-Za-z]+$")) {
			return true;
		} else {
			return false;
		}

	}

	/**
	 * @Title: checkAmountValid
	 * @Description: 检查输入金额是否有效，小数点前6位，后2位。
	 * @param amount
	 * @return
	 * @return: boolean
	 */
	public static boolean checkAmountValid(String amount) {
		Pattern amountPatten = Pattern
				.compile("^((([1-9]\\d{1,4})?\\d)(\\.\\d{1,2})?)$");
		return amountPatten.matcher(amount).matches();
	}




	/**
	 * 四舍五入
	 * 
	 * @param d
	 * @param length
	 *            小数点保留几位
	 * @return
	 */
	public static double rounded(double d, int length) {
		java.math.BigDecimal b = new java.math.BigDecimal(d);
		return b.setScale(length, java.math.BigDecimal.ROUND_HALF_UP)
				.doubleValue();
	}

	/**
	 * 保留两位小数
	 * 
	 * @param d
	 * @return
	 */
	public static String rounded(double d) {
		DecimalFormat r = new DecimalFormat();
		r.applyPattern("#0.00");// 保留小数位数，不足会补零
		return r.format(d);
	}

	/**
	 * 银行卡卫视进行判断
	 * 
	 * @param d
	 * @return
	 */
	public static boolean isBankcard(String d) {
		d = d.replace(" ", "");
		if (d.length() > 19) {
			return false;
		}
		return true;
	}

	/**
	 * 判断字符串是否为数字
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNumeric(String str) {
		Pattern pattern = Pattern.compile("[0-9]*");
		return pattern.matcher(str).matches();
	}



	/**
	 * 判断字符串是否全部为中文字符组成
	 * 
	 * @param str
	 *            检测的文字
	 * @return true：为中文字符串，false:含有非中文字符
	 */
	public static boolean isChineseStr(String str) {
		Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]");
		char c[] = str.toCharArray();
		for (int i = 0; i < c.length; i++) {
			Matcher matcher = pattern.matcher(String.valueOf(c[i]));
			if (!matcher.matches()) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 身份证的验证
	 * 
	 * @param idCardNum
	 *            检测的文字
	 * @return
	 */
	public static boolean validatorIdcard(String idCardNum) {
		if (idCardNum.length() != 18) {
			return false;
		}
		boolean result = false;// 余数标志结果
		char[] idcard = idCardNum.toCharArray();
		int total = 0;// 存放数字和系数相乘的结果相加
		int[] seed = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };// 种子数组
		for (int i = 0; i < idcard.length - 1; i++) {
			total += seed[i] * (int) idcard[i];// 累加
		}
		int modresult = total % 11;// 获取余数
		int[] mod = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };// 余数匹配种子
		for (int c : mod) {
			if (c == modresult) {// 如果余数在余数匹配种子里
				result = true;
				break;
			}
		}
		if (result == false) {// 如果余数不在余数匹配种子，身份证号码不对
			return false;// 返回假
		} else {
			char[] lastChar = { '1', '0', 'X', '9', '8', '7', '6', '5', '4',
					'3', '2' };// 身份证尾数种子
			for (int i = 0; i < lastChar.length; i++) {
				if (lastChar[i] == idcard[idcard.length - 1]) {// 如果身份证号码尾数在身份证尾数种子
					return true;// 返回真
				}
			}
			return false;// 返回假
		}
	}

	/**
	 * 判断银行卡是否为数字
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isBankCard(String str) {
		str = str.replace(" ", "");
		System.out.println("" + str);
		String REG_DIGIT = "[0-9]*";
		return str.matches(REG_DIGIT);
	}

	/**
	 * 截取字符串的最后4位的方法
	 * 
	 * @param str
	 * @return
	 */
	public static String subString4last(String str) {

		if (!TextUtils.isEmpty(str)) {
			return str.substring(str.length() - 4);
		}
		return "";

	}

	/**
	 * 判断少于6位
	 * 
	 * @param
	 */
	public static boolean isSixLengthPasd(String strPass, int i) {
		String str = strPass.toString().trim();
		if (str.length() < i) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 按字符出现的位置截取字符串，并返回截取后的字符串
	 * 
	 * @param str
	 * @param startStr
	 *            开始截取的字符（不截取此字符）
	 * @param lastStr
	 *            结束截取的字符（不截取此字符）
	 * @return
	 */
	public static String subStringData(String str, String startStr,
			String lastStr) {
		if (TextUtils.isEmpty(str) || TextUtils.isEmpty(startStr)) {
			LogUtil.i("StringUtils", "参数传入错误");
			return null;
		}
		int index = str.lastIndexOf(lastStr);
		return str.substring((str.indexOf(startStr) + 1),
				index == -1 ? str.length() : index);
	}

	/**
	 * 获取字符串中的数字
	 * @param str
	 * @return
     */
	public static ArrayList<Integer> getNumPosition(String str){
		ArrayList<Integer> lists = new ArrayList<Integer>();
		for(int i=0;i<str.length();i++){
			char c = str.charAt(i);
			if(c >= 48 & c <= 57){
				lists.add(i);
			}
		}
		return lists;
	}
}
